package com.lt.integration.qywx.auth;

import com.lt.integration.qywx.util.WxUtil;
import com.lt.integration.qywx.weixin.WXBizMsgCrypt;
import com.lt.integration.qywx.weixin.WxAuthorizeLogic;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;

/**
 * 企业微信授权服务
 * @ author     :  Dragon
 * @ Created in :  2022年04月26日 16:18
 */
@Slf4j
public class AuthService {

    /**
     * 企业微信系统事件回调响应
     * @param corpid  url中$CORPID$模板替换后的corpid
     * @param token
     * @param aesKey
     * @param msgSignature  url中的签名
     * @param timestamp   url中的时间戳
     * @param nonce  url中的随机字符串
     * @param echostr  创建套件时验证回调url有效性时传入
     * @return
     */
    public static String callbackSystem(String corpid, String token, String aesKey, String msgSignature, String timestamp, String nonce, String echostr) {
        WxAuthorizeLogic wxAuthorizeLogic = new WxAuthorizeLogic();
        try {
            if(!StringUtils.isBlank(echostr)){
                /*
                 * 验证回调url有效性
                 * 响应需对echostr参数解密并原样返回echostr明文(不能加引号，不能带bom头，不能带换行符)
                 */
                String verifyURLResult = wxAuthorizeLogic.verifyURL(msgSignature, timestamp, nonce, echostr, corpid, token, aesKey);
                return verifyURLResult;
            }else {
                //其他操作
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }


    /**
     * 验证通用开发参数及应用回调
     * @param msgSignature 微信加密签名
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @param echostr 随机字符串 如果是刷新，需返回原echostr
     */
    public static String doGetValid(String corpid, String token, String aesKey, String msgSignature, String timestamp, String nonce, String echostr) {

        try {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, aesKey, corpid);
            String sEchoStr = wxcpt.VerifyURL(msgSignature, timestamp, nonce, echostr);
            System.out.println("verifyurl echostr: " + sEchoStr);
            return sEchoStr;
        } catch (Exception e) {
            //验证URL失败，错误原因请查看异常
            e.printStackTrace();
        }
        return "success";
    }

    /**
     * 刷新 ticket
     * @param corpid         企业微信或应用id
     * @param token          回调配置Token
     * @param aesKey         回调配置 EncodingAESKey
     * @param msgSignature  微信加密签名
     * @param timestamp     时间戳
     * @param nonce         随机数
     * @return
     */
    public static Map<String, Object> doPostValid(HttpServletRequest request, String corpid, String token, String aesKey, String msgSignature, String timestamp, String nonce){
        try {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, aesKey, corpid);
            String postData="";   // 密文，对应POST请求的数据
            //1.获取加密的请求消息：使用输入流获得加密请求消息postData
            ServletInputStream in = request.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String tempStr="";   //作为输出字符串的临时串，用于判断是否读取完毕
            while(null != (tempStr = reader.readLine())){
                postData += tempStr;
            }
            String suiteXml = wxcpt.DecryptMsg(msgSignature, timestamp, nonce, postData);
            log.info("suiteXml: " + suiteXml);
            Map suiteMap = WxUtil.parseXml(suiteXml);
            return suiteMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
}
